Como descargar videos de páginas web donde no tenemos acceso directo al archivo de video y se usan streamings tipo DASH (dynamic adaptive streaming over HTTP).
Primero tenemos que identificar que tipo de metodo está utilizando el sitio web para descargar y reproducir el video.
Para esto vamos a usar la consola de desarrollador del navegador, para acceder hacemos click derecho > Inspeccionar o tambien podemos acceder con F12
Una vez abierta la consola de desarrollador, vamos a la pestaña de Network y buscamos archivos .ts o .m4s (Todo esto mientras se reproduce el video que queremos descargar), estos archivos son los distintos segmentos del video que estamos reproduciendo, en el caso de .m4s habrá dos flujos, uno para el audio y otro para el video.
Lo que tenemos que hacer, para hacerlo lo mas sencillo posible, es buscar el archivo .m3u o .mpd que une todos estos segmentos, normalmente esté archivo se descarga al principio de reproducir el video así que tendremos que buscarlo en la lista antes de los segmentos (podemos filtrar en el buscador por .m3u o .mpd), si hemos abierto la consola de desarrollador despues de empezar a reproducir el video puede ser que estos archivos no se hayan capturado, en ese caso tendremos que refrescar la página (F5) con la consola abierta para que aparezcan en la consola.
En este caso al filtrar por .m3u vemos que hay varios archivos, para saber cual es el correcto solo tenemos que abrirlos y confirmar que los segmentos que vimos previamente (los .ts en este caso), están dentro de ese archivo.
Una vez tenemos localizado el archivo (.m3u o .mpd), usaremos yt-dlp para descargar el video.
El comando a usar es el siguiente:
yt-dlp URL
Para obtener la URL de manera sencilla solo tenemos que hacer click derecho en el archivo, despues Copy y despues Copy URL
Si la web permite obtener el archivo sin ningún tipo de comprobación el video se descargará sin ningún problema.
Si la web requiere de ciertos parámetros en las cabeceras de la petición podríamos ver un error 403, como el siguiente:
En este caso haremos la descarga de los segmentos uno por uno usando las cabeceras que usa la propia web para la solicitud, se explica en la siguiente sección
Si la descarga de los fragmentos requiere de usar ciertas cabeceras en la petición no podremos usar yt-dlp directamente, tendremos que descargar todos los segmentos y despues unirlos.
Normalmente los segmentos van numerados empezando en el 1, por lo tanto podemos copiar la petición cURL usando la consola de desarrollador y usar un script para que vaya descargando todos los segmentos individualmente:
#!/bin/bash
for i in {001..11}
do
# AQUI VA LA PETICION
done
NOTA: El numero 11 es el numero de segmentos que tiene el video, para verificar cual es este numero podemos mirar en el archivo .m3u cual es el numero del ultimo segmento o tambien podemos adelantar el video hasta el final del todo y ver cual es el ultimo archivo .ts que descarga.
NOTA2: En el for es importante el 001, si no se ponen los 0 iniciales podemos tener problemas al unir todos los archivos ya que el shell no los ordenará correctamente (eg: 1.ts y 10.ts irían seguidos y despues iría 2.ts)
Para copiar la petición lo hacemos con: click derecho, Copy y Copy as cURL:
Ahora la petición la pegamos en el script, pero tenemos que hacer un par de modificaciones:
Lo primero al final del todo del comando curl añadimos --output $i.ts
Despues en la primera parte del comando (antes de las cabeceras -H), tenemos que cambiar las comillas simples por comillas dobles y añadir $i en vez del numero del segmento de video, así haremos que el script descargue todos los segmentos.
Despues de los cambios:
Una vez tenemos todo listo ejecutamos el script y se descargarán todos los segmentos guardandose como 001.ts, 002.ts, 003.ts...etc. Una vez tengamos todos los segmentos solo tenemos que unirlos usando cat:
cat *.ts > video.ts
Al hacer esto ya tendremos nuestro video completo guardado como video.ts.
En algunas ocasiones al intentar descargar un video usando yt-dlp con un archivo .mpd veremos un mensaje como el siguiente:
This video is DRM protected
Esto quiere decir está protegido con un DRM (Digital Rights Management), en este caso tendremos que obtener una clave para poder descrifrar el contenido.
Primero tendremos que descargar el video cifrado, para ello usamos yt-dlp así:
yt-dlp --allow-unplayable-format URL_MPD
Esto debería de descargarnos dos archivos, un .mp4 (el video) y un .m4a (el audio), aunque intentemos reproducirlos no podremos, porque están cifrados.
Ahora para poder descifrar los archivos tenemos que obtener la clave, primero necesitamos descargar el archivo .mpd como tal, para poder ver cierta información, lo podemos hacer con wget (o tambien podemos hacerlo desde el propio navegador):
wget URL_MPD
Dentro del archivo .mpd tenemos que buscar pssh, que es uno de los parámetros que necesitaremos para obtener la clave:
A continuación vamos a la siguiente página: https://cdrm-project.com/
Esta página implementa una API que nos permite obtener la clave de la misma manera que lo hace el navegador cuando va a reproducir un video con protección DRM.
Uno de los parámetros que necesitamos es el pssh, que ya lo tenemos, despues también necesitamos la URL del servidor de licencia y los headers que usa el navegador para hacer la consulta a dicha URL.
Para obtener esta información lo hacemos desde la consola de desarrollador en el mismo sitio donde obtenemos los archivos .mpd, .m4s...etc. En este caso buscamos widevine, y deberíamos de ver algo como esto:
En nuestro caso AcquireLicense es la petición que buscamos (no tiene por que llamarse siempre así), los otros archivos que aparecen en la busqueda son básicamente la URL de ese servidor, Ademas esta petición aparece justo al principio de la solicitud de segmentos de video, por lo tanto cuadra con lo que estamos buscando.
Ahora necesitamos copiar la solicitud como fetch, hacemos click derecho, Copy y Copy as fetch:
Ahora en la web de https://cdrm-project.com/ usamos el botón de Paste from fetch:
Y se nos rellenrán todos los campos con la información que hemos copiado de la solicitud del navegador:
NOTA: En realidad al hacer el Copy as fetch tambíen se nos rellena directamente el pssh, no es necesario obtenerlo del .mpd, pero siempre está bien donde conseguirlo si lo necesitamos.
Ahora hacemos click en Submit y si todo ha ido bien nos mostrará la clave que necesitamos para desencriptar nuestros archivos:
NOTA: la clave tiene el formato KID:KEY en nuestro caso la usaremos como tal, pero en algúnas aplicaciones solo nos piden ek KID o solo la KEY, tenemos que tener esto en cuenta a veces solo necesitamos la parte que está antes de los dos puntos (:) o despues de los dos puntos...
Para desencriptar nuetros archivos usaremos la utilidad mp4decrypt que podemos obtenerla de las herramientas de Bento4 https://www.bento4.com/downloads/, los paquetes incluyen varias herramientas pero la única que necesitamos es el mp4decrypt.
Para desencriptar nuestros archivos lo hacemos de la siguiente manera:
./mp4decrypt --key CLAVE archivo_encriptado archivo_salida
Tenemos que hacer esto con nuestros dos archivos, tanto con el .mp4 como con el .m4a
Una vez hecho esto ya tendremos nuestros dos archivos listos y reproducibles, el audio se escuchará y el video se verá, solo nos queda unirlos en un único archivo.
Para unirlos lo haremos con ffmpeg, el comando que usaremos será:
ffmpeg -i MiVideo.mp4 -i MiAudio.m4a -vcodec copy -acodec copy video.mp4
Con ese comando se juntarán ambos archivos en video.mp4 manteniendo su codec original, si queremos también podemos aprovechar para hacer una conversión de codec en vez de usar copy, lo haríamos así:
ffmpeg -i MiVideo.mp4 -i MiAudio.m4a -vcodec libx264 -acodec aac video.mp4
Video | DRM | Web | DASH